home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 157_01 / qed9 < prev    next >
Text File  |  1987-10-10  |  4KB  |  147 lines

  1. /*  VERSION 0011  (DATE: 03/03/87)  (TIME: 09:58)  */
  2. /*
  3.     e (qed) screen editor
  4.  
  5.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  6.  
  7.     August-December 1981
  8.  
  9.     Modified: Aug-Dec    1984:    BDS-C 'e'(vers 4.6a) to 'qe' (J.W. Haefner)
  10.               March        1985:    BDS-C 'qe' to DeSmet-C 'qed' (J.W. Haefner)
  11.  
  12.     FILE: qed9
  13.  
  14.     FUNCTIONS: initvm,freememslot,swapout,writepage,swappin,readpage,
  15.             fatalerror
  16.  
  17.     PURPOSE: manages virtual memory
  18.  
  19. */
  20.  
  21. #include "qed.h"
  22.  
  23. long lseek();
  24. unsigned writepage();
  25.  
  26. initvm()    /*initialise virtual memory system*/
  27. {
  28.     int slot;
  29.     unsigned base;
  30.     char *pagemem, *stkaddr;
  31.  
  32.     stkaddr=_showsp();
  33.     pagemem=_memory();
  34.     slotsinmem=(stkaddr-STKSPACE-pagemem)/PAGESIZE;
  35.     if (slotsinmem < 3) {
  36.         putstr("More memory needed to run 'e'"); 
  37.         exit();
  38.         }
  39.     if (slotsinmem > MAXMEMSLOTS) slotsinmem=MAXMEMSLOTS;
  40.     for (slot=0, base=pagemem; slot < slotsinmem; slot++, base+=PAGESIZE) {
  41.         usage[slot]=FREE;
  42.         slotaddr[slot]=base;
  43.         }
  44.     clock=0;
  45.  
  46.     /*reserve slot 0 for tp*/
  47.     tp=pagemem; 
  48.     tppages=1;
  49.     usage[0]=NOTAVAIL;
  50.  
  51.     /*force balloc to find a new page to start*/
  52.     pageloc[(newpage=0)]=FREE; 
  53.     allocp=PAGESIZE+1;
  54.  
  55.     /*paging file not yet created*/
  56.     pagefd=NOFILE;
  57.     strcpy(pagingfile," :qe$$$.$$$");
  58.     pagingfile[0]=((pagingdisk) ? pagingdisk : (curdsk+'A'));
  59.     /*put pagingfile on pagingdisk*/
  60.     if(pagingdisk) pagingfile[0]=pagingdisk;
  61. }
  62.  
  63. freememslot()    /*returns the number of a free memory slot, possibly by swapping
  64.           out the least recently used page currently in memory*/
  65. {
  66.     int use, u;
  67.     int i, slot;
  68.  
  69.     for (use=MAXINT, i=0; (use) && (i < slotsinmem); i++)
  70.         if ( ((u=usage[i]) != NOTAVAIL) && (u <= use)) {
  71.             use=u; 
  72.             slot=i;
  73.             }
  74.     if (use) /*no free slots*/ swapout(slot);
  75.     return slot;
  76. }
  77.  
  78. swapout(slot)    /*swaps page currently in memory at 'slot' to disk,
  79.           updating pageloc to show new location*/
  80. int slot;
  81. {
  82.     int *pl;
  83.     /*long *pl;*/
  84.  
  85.     /*find page number of page at 'slot'*/
  86.     for (pl=&pageloc[0]; *pl != slot; pl++);
  87.          /*update pageloc with disk slot written to */
  88.     *pl=-(writepage(slot));
  89. }
  90.  
  91. unsigned writepage(slot)    /*writes page currently in memory at 'slot' to disk;
  92.                                 returns disk slot where written*/
  93. int slot;
  94. {
  95.     unsigned loc;
  96.     long sekbytes;
  97.  
  98.     if (pagefd == NOFILE) { /*haven't opened paging file yet*/
  99.     /*if (dskcheck(setjmp(dskerr)) || (pagefd=creat(pagingfile)) == FAIL)*/
  100.     if ((pagefd=creat(pagingfile)) == FAIL)
  101.         fatalerror("Can't create a buffer file");
  102.         for (loc=0; loc < MAXSLOTS; loc++) dskslots[loc]=FREE;
  103.         }
  104. for (loc=0; dskslots[loc] != FREE; loc++); /*find a free slot*/
  105. sekbytes=(long)(loc)*(long)PAGESIZE;
  106. if (lseek(pagefd,sekbytes,ABSOLUTE) == (long)FAIL)
  107.         fatalerror("Bad seek in writing buffer");
  108.     if (write(pagefd,slotaddr[slot],PAGESIZE) == FAIL)
  109.         fatalerror("Can't write to buffer - disk full");
  110.     dskslots[loc]=INUSE;
  111.     usage[slot]=FREE;
  112.     return loc;
  113. }
  114.  
  115. swappin(page)    /*get 'page', currently on disk, into memory and return slot
  116.           where placed*/
  117. int page;
  118. {
  119.     int slot;
  120.  
  121.     readpage( (slot=freememslot()), -pageloc[page]);
  122.     usage[slot]=INUSE;
  123.     return pageloc[page]=slot;
  124. }
  125.  
  126. readpage(memslot,dskslot)    /*read a page from disk into memory at 'memslot'*/
  127. int memslot;
  128. int dskslot;
  129. {
  130.     long sekbytes;
  131.     sekbytes=(long)(dskslot) * (long)PAGESIZE;
  132.     if (lseek(pagefd,sekbytes,ABSOLUTE) == (long)FAIL)
  133.         fatalerror("Bad seek in reading buffer");
  134.     if (read(pagefd,slotaddr[memslot],PAGESIZE) != PAGESIZE)
  135.         fatalerror("Can't read buffer");
  136.     dskslots[dskslot]=FREE;
  137. }
  138.  
  139. fatalerror(message)    /*displays message, returns to a known good screen*/
  140. char *message;
  141. {
  142.     error(message);
  143.     moveline(goodline-cline);
  144.     longjmp(0,1);
  145.     /*exit();*/
  146. }
  147.